import { DynamicModule, FactoryProvider, ModuleMetadata, Provider } from '@nestjs/common'

/**
 * 生成匿名模块
 * @param option 匿名模块选项
 * @returns 匿名模块
 */
export function anonymousModule<ModuleOption>(option: AnonymousModuleOption<ModuleOption>): DynamicModule {
  // 创建提供者数组
  const providers: Provider[] = [
    {
      provide: option.provide, // 提供者提供
      useFactory: option.useFactory, // 使用工厂方法创建提供者
      inject: option.inject || [], // 注入依赖
    },
  ]

  // 返回匿名模块
  return {
    module: this, // 指向当前模块
    imports: option.imports || [], // 导入模块
    providers, // 提供者数组
  }
}

/**
 * 匿名模块选项
 */
export interface AnonymousModuleOption<ModuleOption> extends FactoryProvider {
  imports?: ModuleMetadata['imports'] // 可选的导入模块
}
